/*****************************************************************************
*
*  @file     GpioDriver.c
*  @brief    Gpio驱动
*            1. 负责实现gpio驱动
*			 2. 负责实现为各个模块提供IO控制接口
*
*  @author   潘学林
*  @email                                        
*  @version  V0.000
*  @date     2022/4/11
*  @license  /
*----------------------------------------------------------------------------*
*  Remark         : Description                                              *
*----------------------------------------------------------------------------*
*  Change History :                                                          *
*  <Date>     | <Version> | <Author>       | <Description>                   *
*----------------------------------------------------------------------------*
*  2022/4/11  | 0.000     | 潘学林         | 创建文件                        *
*----------------------------------------------------------------------------*
*
*****************************************************************************/

#ifndef _GPIODRIVER_H_
#define _GPIODRIVER_H_

/* Includes ------------------------------------------------------------------*/

#include "Std_Types.h" 
#include "gd32f30x.h"
#include "systick.h"

/* Micros/Enumerate/Structures -----------------------------------------------*/

/**
 * @brief 引脚定义 OUT
 */
#define CAN0_STB_Pin GPIO_PIN_10
#define CAN0_STB_Port GPIOA
#define CAN1_STB_Pin GPIO_PIN_14
#define CAN1_STB_Port GPIOB
#define VPRO_AFE1_EN_Pin GPIO_PIN_8
#define VPRO_AFE1_EN_Port GPIOB
#define VPRO_AFE2_EN_Pin GPIO_PIN_15
#define VPRO_AFE2_EN_Port GPIOB
#define CHARGE_RELAY_EN_Pin GPIO_PIN_9
#define CHARGE_RELAY_EN_Port GPIOB
#define TEST_LED_Pin GPIO_PIN_2
#define TEST_LED_Port GPIOB

/**
 * @brief 引脚定义 IN
 */
#define DiSCHARGE_STA_Pin GPIO_PIN_7    //lmy
#define DiSCHARGE_STA_Port GPIOC
#define SHUNT_MOS_Pin GPIO_PIN_8
#define SHUNT_MOS_Port GPIOC
#define CHARGE_STA_Pin GPIO_PIN_9
#define CHARGE_STA_Port GPIOC

/* 
*	是否开启GPIO自测功能 
* 定义表示开启GPIO自测功能 
* 未定义表示不开启GPIO自测功能 
*/
#define IF_ENABLE_GPIO_SELF_TEST

/**
 * @brief OUT类型
 * @note  None
 */
typedef enum GPIO_DRIVER_OUT_TYPE
{
    CAN0_STB = 0, /* can standby mode */
    CAN1_STB = 1, /* can standby mode */
    VPRO_AFE1_EN = 2, /* AFE1 enable */
    VPRO_AFE2_EN = 3, /* AFE2 enable */
    CHARGE_RELAY_EN = 4, /* 继电器输出使能 */
    TEST_LED = 5, /* ... */
    IO_OUT_TYPE_MAX = 6, /* IO类型总数 */
}GPIO_DRIVER_OUT_TYPE;

/**
 * @brief IN类型
 * @note  None
 */
typedef enum GPIO_DRIVER_IN_TYPE
{
    DiSCHARGE_STA = 0, /* 放电MOS状态 */
    SHUNT_MOS = 1, /* 互锁信号 */
    CHARGE_STA = 2, /* 插枪状态 */
    IO_IN_TYPE_MAX = 3, /* IO类型总数 */
}GPIO_DRIVER_IN_TYPE;

/* Variables -----------------------------------------------------------------*/

/* Functions -----------------------------------------------------------------*/

/*****************************************
* 接口函数
*****************************************/

/**
  * @brief  gpio驱动初始化
  * @param  None
  * @retval None
  */
void GpioDriver_Init(void);

/**
  * @brief  gpio轮询任务
  * @param  None
  * @retval None
  */
void GpioDriver_PollTask(void);

/**
  * @brief  设置输出状态（高电平使能还是低电平使能在初始化时给定）
	* @param  type 类型；state 输出状态，TRUE表示使能输出
	* @retval None
  */
void GpioDriver_SetOutputState(GPIO_DRIVER_OUT_TYPE type,BOOL state);

/**
  * @brief  获取输入状态
  * @param  type 类型
  * @retval 输入状态
  */
BOOL GpioDriver_GetInputState(GPIO_DRIVER_IN_TYPE type);

/**
  * @brief  Gpio输出测试-Icu使用
  * @param  None
  * @retval None
  */
void GpioDriver_IcuTest(void);

/**
  * @brief  Gpio自测
  * @param  None
  * @retval None
  */
void GpioDriver_SelfTest(void);

#endif

/********************************* END OF FILE ********************************/

